Various provisioning techniques have been developed to allow a user to obtain and configure the capacity of a computing system. The computing system can be provisioned or allocated with computing resources that are available over a network. The computing resources can include hardware resources (such as central processing units (CPUs), memory and storage) and software resources (such as virtual machines and operating systems). A user can scale up or down the capacity as the computing requirements change. For example, a user can set up a server without actually owning a server machine or an operating system. Instead, the user can request, through a web interface over a network, a scalable amount of CPU processing power and the necessary software according to actual demands. The user then only pays for the amount of usage.
In some scenarios, the computing demand of a user can fluctuate rapidly over a time period. For example, an online service may receive an unprecedented amount of traffic at some point. Then all of a sudden, the online service may see a lull in the traffic and may need to quickly release the resources that have already been provisioned. Conventional techniques sometimes have problems in providing computing resources that both satisfy the user's dynamic demands and protect the user's financial interests. As a result, cloud performance and cost effectiveness can become uncoupled, resulting in either sluggish performance due to a lack of provisioned resources or high costs from a cloud provider (such as Amazon EC2) when faced with unprecedented demand upon the cloud.